home *** CD-ROM | disk | FTP | other *** search
-
- RECV(2) UNIX Programmer's Manual RECV(2)
-
- NNAAMMEE
- rreeccvv, rreeccvvffrroomm, rreeccvvmmssgg - receive a message from a socket
-
- SSYYNNOOPPSSIISS
- ##iinncclluuddee <<ssyyss//ttyyppeess..hh>>
- ##iinncclluuddee <<ssyyss//ssoocckkeett..hh>>
-
- _s_s_i_z_e___t
- rreeccvv(_i_n_t _s, _v_o_i_d _*_b_u_f, _s_i_z_e___t _l_e_n, _i_n_t _f_l_a_g_s)
-
- _s_s_i_z_e___t
- rreeccvvffrroomm(_i_n_t _s, _v_o_i_d _*_b_u_f, _s_i_z_e___t _l_e_n, _i_n_t _f_l_a_g_s, _s_t_r_u_c_t _s_o_c_k_a_d_d_r _*_f_r_o_m,
- _i_n_t _*_f_r_o_m_l_e_n)
-
- _s_s_i_z_e___t
- rreeccvvmmssgg(_i_n_t _s, _s_t_r_u_c_t _m_s_g_h_d_r _*_m_s_g, _i_n_t _f_l_a_g_s)
-
- DDEESSCCRRIIPPTTIIOONN
- RReeccvvffrroomm() and rreeccvvmmssgg() are used to receive messages from a socket, and
- may be used to receive data on a socket whether or not it is connection-
- oriented.
-
- If _f_r_o_m is non-nil, and the socket is not connection-oriented, the source
- address of the message is filled in. _F_r_o_m_l_e_n is a value-result parame-
- ter, initialized to the size of the buffer associated with _f_r_o_m, and mod-
- ified on return to indicate the actual size of the address stored there.
-
- The rreeccvv() call is normally used only on a _c_o_n_n_e_c_t_e_d socket (see
- connect(2)) and is identical to rreeccvvffrroomm() with a nil _f_r_o_m parameter.
- As it is redundant, it may not be supported in future releases.
-
- All three routines return the length of the message on successful comple-
- tion. If a message is too long to fit in the supplied buffer, excess
- bytes may be discarded depending on the type of socket the message is re-
- ceived from (see socket(2)).
-
- If no messages are available at the socket, the receive call waits for a
- message to arrive, unless the socket is nonblocking (see fcntl(2)) in
- which case the value -1 is returned and the external variable _e_r_r_n_o set
- to EAGAIN. The receive calls normally return any data available, up to
- the requested amount, rather than waiting for receipt of the full amount
- requested; this behavior is affected by the socket-level options
- SO_RCVLOWAT and SO_RCVTIMEO described in getsockopt(2).
-
- The select(2) call may be used to determine when more data arrive.
-
- The _f_l_a_g_s argument to a recv call is formed by _o_r'ing one or more of the
- values:
-
- MSG_OOB process out-of-band data
- MSG_PEEK peek at incoming message
- MSG_WAITALL wait for full request or error
- The MSG_OOB flag requests receipt of out-of-band data that would not be
- received in the normal data stream. Some protocols place expedited data
- at the head of the normal data queue, and thus this flag cannot be used
- with such protocols. The MSG_PEEK flag causes the receive operation to
- return data from the beginning of the receive queue without removing that
- data from the queue. Thus, a subsequent receive call will return the
- same data. The MSG_WAITALL flag requests that the operation block until
- the full request is satisfied. However, the call may still return less
- data than requested if a signal is caught, an error or disconnect occurs,
- or the next data to be received is of a different type than that re-
- turned.
-
- The rreeccvvmmssgg() call uses a _m_s_g_h_d_r structure to minimize the number of di-
- rectly supplied parameters. This structure has the following form, as
- defined in <_s_y_s_/_s_o_c_k_e_t_._h>:
-
- struct msghdr {
- caddr_t msg_name; /* optional address */
- u_int msg_namelen; /* size of address */
- struct iovec *msg_iov; /* scatter/gather array */
- u_int msg_iovlen; /* # elements in msg_iov */
- caddr_t msg_control; /* ancillary data, see below */
- u_int msg_controllen; /* ancillary data buffer len */
- int msg_flags; /* flags on received message */
- };
-
- Here _m_s_g___n_a_m_e and _m_s_g___n_a_m_e_l_e_n specify the destination address if the
- socket is unconnected; _m_s_g___n_a_m_e may be given as a null pointer if no
- names are desired or required. _M_s_g___i_o_v and _m_s_g___i_o_v_l_e_n describe scatter
- gather locations, as discussed in read(2). _M_s_g___c_o_n_t_r_o_l, which has length
- _m_s_g___c_o_n_t_r_o_l_l_e_n, points to a buffer for other protocol control related
- messages or other miscellaneous ancillary data. The messages are of the
- form:
-
- struct cmsghdr {
- u_int cmsg_len; /* data byte count, including hdr */
- int cmsg_level; /* originating protocol */
- int cmsg_type; /* protocol-specific type */
- /* followed by
- u_char cmsg_data[]; */
- };
- As an example, one could use this to learn of changes in the data-stream
- in XNS/SPP, or in ISO, to obtain user-connection-request data by request-
- ing a recvmsg with no data buffer provided immediately after an aacccceepptt()
- call.
-
- Open file descriptors are now passed as ancillary data for AF_UNIX domain
- sockets, with _c_m_s_g___l_e_v_e_l set to SOL_SOCKET and _c_m_s_g___t_y_p_e set to
- SCM_RIGHTS.
-
- The _m_s_g___f_l_a_g_s field is set on return according to the message received.
- MSG_EOR indicates end-of-record; the data returned completed a record
- (generally used with sockets of type SOCK_SEQPACKET). MSG_TRUNC indicates
- that the trailing portion of a datagram was discarded because the data-
- gram was larger than the buffer supplied. MSG_CTRUNC indicates that some
- control data were discarded due to lack of space in the buffer for ancil-
- lary data. MSG_OOB is returned to indicate that expedited or out-of-band
- data were received.
-
- RREETTUURRNN VVAALLUUEESS
- These calls return the number of bytes received, or -1 if an error oc-
- curred.
-
- EERRRROORRSS
- The calls fail if:
-
- [EBADF] The argument _s is an invalid descriptor.
-
- [ENOTCONN] The socket is associated with a connection-oriented proto-
- col and has not been connected (see connect(2) and
- accept(2)).
-
- [ENOTSOCK] The argument _s does not refer to a socket.
-
- [EAGAIN] The socket is marked non-blocking, and the receive opera-
- tion would block, or a receive timeout had been set, and
-
- the timeout expired before data were received.
-
- [EINTR] The receive was interrupted by delivery of a signal before
- any data were available.
-
- [EFAULT] The receive buffer pointer(s) point outside the process's
- address space.
-
- SSEEEE AALLSSOO
- fcntl(2), read(2), select(2), getsockopt(2), socket(2)
-
- HHIISSTTOORRYY
- The rreeccvv() function call appeared in 4.2BSD.
-
- 4.3-Reno Berkeley Distribution February 21, 1994 3
-